package com.afdor.rws.event.driven.config;

import com.afdor.rws.annotation.extension.Extension;
import com.afdor.rws.annotation.extension.SPI;
import com.afdor.rws.event.driven.commons.Constants;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.NonNull;

import java.io.Serializable;

/**
 * 事件相关配置<br/>
 * Extension : singleton
 *
 * @author 悭梵
 * @date Created in 2018-11-21 15:45
 */
@Data
@NoArgsConstructor
@SPI(Constants.DEFAULT_CONFIG_EXTENSION_NAME)
@Extension(value = Constants.DEFAULT_CONFIG_EXTENSION_NAME, interfaceClass = EventConfig.class)
public class EventConfig<T> implements Serializable, Cloneable {
    /**
     * 应用名称
     */
    private String appName;
    /**
     * 事件ID 生成策略，扩展点名称。默认uuid，由IdGeneratorStrategy.SPI("uuid")负责激活
     */
    private String idStrategyName;
    /**
     * 事件时间获取策略，扩展点名称。默认local_timestamp，由TimestampStrategy.SPI("local_timestamp")负责激活
     */
    private String timestampStrategyName;
    /**
     * 自定义事件总线扩展点名称。默认default，有EventBus.SPI("default")负责激活默认值
     */
    private String eventBusStrategyName;
    /**
     * 事件源，扩展点名称。默认default，由EventSource.SPI("default")负责激活默认值
     */
    @NonNull
    private String eventSourceStrategyName;
    /**
     * 事件源管理器，扩展点名称。默认default，由EventSourceManager.SPI("default")负责激活默认值
     */
    @NonNull
    private String eventSourceManagerStrategyName;

    /**
     * 事件持久化管理器，扩展点名称。默认default，由EventPersistenceManager.SPI("default")负责激活默认值
     */
    private String eventPersistenceManagerStrategyName;

    /**
     * 事件传递通道扩展点名称，必填。各种实现方式，默认值不一样
     */
    @NonNull
    private String eventChannelStrategyName;
    /**
     * 事件序列化扩展点名称，必填。各种实现方式，存在默认值不一样情况
     */
    @NonNull
    private String serializationStrategyName;

    /**
     * 生产者扩展点名称，必填。各种实现方式，存在默认值不一样情况
     */
    @NonNull
    private String eventProducerStrategyName;

    /**
     * 消费者扩展点名称，必填。各种实现方式，存在默认值不一样情况
     */
    @NonNull
    private String eventConsumerStrategyName;

    /**
     * 事件状态变更管理器扩展点名称。默认default，由EventStatusChangeManager.SPI("default")负责激活默认值
     */
    private String eventChangeManagerStrategyName;

}
